/*
 * ContextoMedicamento
 */

package ocp.bundles.esb.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import ocp.context.Attribute;
import ocp.context.AttributeDefinition;
import ocp.context.Context;
import ocp.context.ContextClass;
import ocp.context.ContextualInformation;
import ocp.context.ContextualInformationAbsentException;
import ocp.context.ContextualInformationList;
import ocp.context.SimpleContext;


/**
 * Encapsula un contexto de tipo Medicamento. Permite leer los atributos
 * del contexto de una manera directa. Existen dos formas de crear la clase:
 * 1. A partir de los atributos tagId, nombre...
 * 2. A partir de un contexto de clase Context ya creado
 * 
 * @author Paco López Mármol
 */
public class ContextoMedicamento  {
    public static final String FECHA_FORMATO = "yyyy-MM-dd'T'HH:mm:ss";
    // contexto
    private SimpleContext context = null; 
    // taqID del medicamento
    private String tagId; 
    // Nombre del medicamento
    private String nombre;  
    // Localización
    private String localizacion; 
    // fecha de caducidad
    private Date fCad;
    // fecha de etiquetado
    private Date fEtiq;
    // fechas en string
    private String fCaducidad;  // formato "yyyy-MM-dd'T'HH:mm:ss"
    private String fEtiquetado;
        
    /**
     * Constructor. 
     * Crea un contexto con información de tipo LocationContext
     * @param tagId tagId de RFID que identifica a la unidad de medicamento
     * @param nombre nombre del medicamento
     * @param localizacion localizacion del medicamento
     * @param fCad Fecha de Caducidad
     * @param fEtiq Fecha de Etiquetado
     */
    public ContextoMedicamento(String tagId , String nombre , String localizacion , Date fCad , Date fEtiq ) {

        this.localizacion = localizacion;
        this.nombre = nombre;
        this.tagId = tagId;
        this.fCad = fCad;
        this.fEtiq = fEtiq;
        
        try {
            
            // Se crea un contexto simple de tipo Medicamento
            context = new SimpleContext( "Medicamento-" + tagId, "Medicamento-" + tagId  );
            
            // Creamos ContextualInformation de clase LocationContext
            ContextClass contextClass = new ContextClass("LocationContext");
            // Activamos el historico para poder acceder a estados anteriores
            contextClass.setHistorical(true);  
            
            // Atributos 
            Hashtable h = new Hashtable();
            Attribute tagIdAt = new Attribute(new AttributeDefinition("tagId", String.class), tagId );
            h.put("tagId", tagIdAt);
            Attribute nombreAt = new Attribute(new AttributeDefinition("nombre", String.class), nombre );
            h.put("nombre", nombreAt);
            Attribute localizacionAt = new Attribute(new AttributeDefinition("localizacion", String.class), localizacion );
            h.put("localizacion", localizacionAt);
            fCaducidad = new SimpleDateFormat( FECHA_FORMATO ).format( fCad );
            fEtiquetado = new SimpleDateFormat( FECHA_FORMATO ).format( fEtiq );
            Attribute fCaducidadAt = new Attribute(new AttributeDefinition("fCaducidad", String.class),getFCaducidad() );
            h.put("fCaducidad", fCaducidadAt);
            Attribute fEtiquetadoAt = new Attribute(new AttributeDefinition("fEtiquetado", String.class),getFEtiquetado() );
            h.put("fEtiquetado", fEtiquetadoAt);
            
            ContextualInformation ci = new ContextualInformation(
                  contextClass, "Medicamento-" + tagId, "", h, new Vector() );
            
            // Creamos la lista de ContextualInformation
            ContextualInformationList cil = new ContextualInformationList();
            cil.addContextualInformation(ci);
            
            // Añadimos esta lista al contexto
            context.addContextualInformationList(cil);
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
    /**
     * Constructor a partir de un contexto ya leido. Lee los atributos del 
     * contexto(Context) 
     * @param context Contexto leido del servicio OCP
     */
    public ContextoMedicamento( Context context ) {
        this.context = (SimpleContext)context;
        
        // Extrae los atributos del contexto 
        Enumeration<ContextualInformation> e;
        try {
            e = context.getContextualInformation().getContextualInformation();
            // Navega por los atributos del contexto
            for (; e.hasMoreElements();)  {
                ContextualInformation ci = e.nextElement();
                if (ci != null) {
                    Enumeration<Attribute> ca = ci.getAttributes();
                    while (ca.hasMoreElements()) {
                        Attribute attribute = ca.nextElement();
                        String attributeName = attribute.getAttributeDefinition().getName();
                        // Carga los campos de la clase con los valores de los atributos
                        if( attributeName.equals("nombre") )  {
                            nombre = new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("localizacion") )  {
                            localizacion = new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("tagId") )  {
                            tagId = new String( attribute.getValue().toString() );
                        }
                        else if( attributeName.equals("fCaducidad") )  {
                            fCaducidad = new String( attribute.getValue().toString() );
                            try {
                                fCad = new SimpleDateFormat( FECHA_FORMATO ).parse(fCaducidad);
                            } catch (ParseException ex) {
                                Logger.getLogger(ContextoMedicamento.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                        else if( attributeName.equals("fEtiquetado") )  {
                            fEtiquetado = new String( attribute.getValue().toString() );
                            try {
                                fEtiq = new SimpleDateFormat( FECHA_FORMATO ).parse(fEtiquetado);
                            } catch (ParseException ex) {
                                Logger.getLogger(ContextoMedicamento.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                        
                    }
                }  // ci != null
            } // end - for
        } catch (ContextualInformationAbsentException ex) {
            Logger.getLogger(ContextoMedicamento.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    

        
    /**
     * Muestra los datos del contexto de tipo Medicamento
     * @param prefijo Prefijo para poner al principio de cada linea
     * @param title Titulo a mostrar
     */
    public void printContext(String prefijo,String title){
        
        System.out.println( prefijo + "----------------- " + title + " -----------------");
        System.out.println( prefijo + "Name: " + context.getName());
        System.out.println( prefijo + "Id: " + context.getId());
        System.out.println( prefijo + " nombre: " + nombre );
        System.out.println( prefijo + " localizacion: " + localizacion );
        System.out.println( prefijo + " tagId: " + tagId );
        System.out.println( prefijo + " fCaducidad: " + fCaducidad );
        System.out.println( prefijo + " fEtiquetado: " + fEtiquetado );
                
    }
    

    /**
     * Obtiene el contexto 
     * @return el contexto simple
     */
    public SimpleContext getContext() {
        return context;
    }

    /**
     * Obtiene el atributo tagId
     * @return tagId
     */
    public String getTagId() {
        return tagId;
    }
    
    /**
     * Obtiene el id del contexto que encapsula
     * @return el id del contexto
     */
    public String getContextId() {
        return context.getId();
    }

    /**
     * Obtiene el atributo nombre 
     * @return nombre del medicamento
     */ 
    public String getNombre() {
        return nombre;
    }

    /**
     * Obtiene la localización
     * @return localizacion
     */
    public String getLocalizacion() {
        return localizacion;
    }

    /**
     * Obtiene la fecha de caducidad
     * @return la fecha en formato "yyyy-MM-dd'T'HH:mm:ss"
     */
    public String getFCaducidad() {
        return fCaducidad;
    }

    /**
     * Obtiene la fecha de etiquetado
     * @return la fecha en formato "yyyy-MM-dd'T'HH:mm:ss"
     */
    public String getFEtiquetado() {
        return fEtiquetado;
    }

    /**
     * Obtiene la fecha de caducidad
     * @return la fecha 
     */
    public Date getFCad() {
        return fCad;
    }

    /**
     * Obtiene la fecha de etiquetado
     * @return la fecha 
     */
    public Date getFEtiq() {
        return fEtiq;
    }

}
